package com.hyper_yang._03_designpatterns.pattern;
/*
单例模式:
    概念: 单例模式是GOF设计模式的一种，体现是类只有一个对象，全局共享这一个对象。
 */
public class SingletonPattern {
    public static void main(String[] args) {
        Single single1 = Single.single;
        Single single2 = Single.single;
        System.out.println((single1 == single2));

        LazySingle lazySingle1 = LazySingle.getInstance();
        LazySingle lazySingle2 = LazySingle.getInstance();
        System.out.println((lazySingle1 == lazySingle2));
    }
}

// 饿汉式，不管你用不用，都创建好了
class Single {
    public static final Single single = new Single();

    private Single() {
    }
}

// 懒汉式，用的时候再创建
class LazySingle {
    // 懒汉式: 外界不能访问这个属性
    private static LazySingle lazySingle;

    // 懒汉式: 外界不能访问构造器
    private LazySingle() {
    }

    // 对外提供获取对象的方法，方法执行才创建对象
// 1   public static LazySingle getInstance() { // 多线程不安全
// 2   public static synchronized LazySingle getInstance() { // 线程安全但效率低
// 3   public static LazySingle getInstance() {
//        synchronized (LazySingle.class) {
//            if (lazySingle == null)
//                lazySingle = new LazySingle();
//        }
//        return lazySingle;
//    }
    // todo: 对比同步方法 线程安全 效率高 对线程实现分流
    public static LazySingle getInstance() {
        if (lazySingle == null) {
            synchronized (LazySingle.class) {
                if (lazySingle == null)
                    lazySingle = new LazySingle();
            }
        }
        return lazySingle;
    }
}